# -*- coding: utf-8 -*-
"""
@Time ： 2022/8/4 20:20
@Auth ： Mr. William 1052949192
@Company ：特斯汀学院 @testingedu.com.cn
@Function ：Web自动化关键字封装
"""
import re
import time

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.select import Select

from class10.verify import Verify
from class12_1.decs import relations


class Web:
    """web自动化关键字类"""

    def __init__(self):
        self.driver: webdriver.Chrome = None
        # 使用字典保存关联的数据
        self.relation_dict = {}

    def openbrowser(self, br='gc'):
        """
        打开浏览器
        :param br: 默认是谷歌浏览器
        支持gc:chrome；ie:internet explorer；ff:firefox
        :return:
        """
        if br == 'ff':
            self.driver = webdriver.Firefox()
        elif br == 'ie':
            self.driver = webdriver.Ie()
        else:
            option = Options()
            # 在打开浏览器之前，去掉自动化标识
            option.add_experimental_option('excludeSwitches', ['enable-automation'])
            # option.add_argument('--disable-blink-features=AutomationControlled')

            # 关掉密码弹窗
            prefs = {}
            prefs['credentials_enable_service'] = False
            prefs['profile.password_manager_enabled'] = False
            option.add_experimental_option('prefs', prefs)
            self.driver = webdriver.Chrome(options=option)

        # 默认配置隐式等待
        self.driver.implicitly_wait(3)
        # 最大化
        self.driver.maximize_window()

    def geturl(self, url=''):
        """
        打开网站
        :param url: 网站地址
        """
        if url.startswith('http'):
            self.driver.get(url)
        else:
            self.driver.get('http://' + url)

    def __find_ele(self, lo=''):
        # 通过特定，兼容三种定位；其他方式，可以通过手写xpath兼容
        if lo.startswith('/') or lo.startswith('('):
            # xpath：一般以/开头，可能以(开头
            ele = self.driver.find_element('xpath', lo)
        elif lo.startswith('#'):
            # css：一般以#开头
            ele = self.driver.find_element('css selector', lo)
        else:
            ele = self.driver.find_element('id', lo)

        return ele

    @relations
    def input(self, lo='', value=''):
        """
        输入
        :param lo: 定位器（可以是xpath，id，css selector）
        :param value: 需要输入的值
        """
        # 通过特定，兼容三种定位；其他方式，可以通过手写xpath兼容
        ele = self.__find_ele(lo)
        ele.send_keys(value)

    def click(self, lo=''):
        """
        点击
        :param lo: 定位器（可以是xpath，id，css selector）
        """
        ele = self.__find_ele(lo)
        ele.click()

    def tryclick(self, lo=''):
        """
        点击
        :param lo: 定位器（可以是xpath，id，css selector）
        """
        try:
            self.driver.implicitly_wait(4)
            ele = self.__find_ele(lo)
            ele.click()
        except Exception as e:
            print('尝试点击元素%s错误' % lo)
        finally:
            self.driver.implicitly_wait(10)

    def jsclick(self, lo=''):
        """
        点击
        :param lo: 定位器（可以是xpath，id，css selector）
        """
        ele = self.__find_ele(lo)
        self.driver.execute_script("arguments[0].click()", ele)

    def slide12306(self):
        # 找到滑块
        ele = self.__find_ele('//*[@id="nc_1_n1z"]')
        # 使用selenium鼠标操作类
        action = ActionChains(self.driver)
        # 按住滑块
        action.click_and_hold(ele)
        # 滑动到右边300像素位置
        action.move_by_offset(300, 0)
        # 松开鼠标
        action.release()
        # 使所有操作生效!!!!!!!!!!
        action.perform()

    def getverify(self):
        # 截取验证码图片
        ele_img = self.__find_ele('//*[@id="verify_code_img"]')
        ele_img.screenshot('./verify.png')
        verify = Verify('wuqingfqng', 'wuqing&fqng', '904357')
        # 调用方法，获取验证码
        ver = verify.get_verify('./verify.png')
        self.relation_dict['verify'] = ver
        return ver

    def gettext(self, lo='', reg=''):
        """
        获取元素文本
        :param lo: 定位器（可以是xpath，id，css selector）
        :param lo: 对文本进行正则处理
        """
        ele = self.__find_ele(lo)
        text = ele.text
        # 如果有正则，就按正则处理
        if reg:
            text = re.findall(reg, text)
            if text:
                text = text[0]

        # 你获取的属性，可以变成一个系统变量，{text}保存起来
        self.relation_dict['text'] = text
        return text

    @relations
    def saveparams(self, name='', value=''):
        """
        把参数保存为特定名字
        :param name: 参数名
        :param value: 参数值
        """
        self.relation_dict[name] = value

    def sleep(self, t='1'):
        """
        固定等待
        :param t: 时间，单位秒
        """
        try:
            t = float(t)
        except Exception as e:
            print(e.__str__())
            t = 1

        time.sleep(t)

    def select(self, lo='', value=''):
        """
        下拉框选择，兼容value和visibletext
        :param lo: 定位器（可以是xpath，id，css selector）
        :param value: 整数使用value，其他使用visibletext
        :return:
        """
        # 找到select元素
        ele = self.__find_ele(lo)
        # 用上面的select元素创建selenium的Select对象
        p_select = Select(ele)
        try:
            # 整数使用value
            value = int(value)
            p_select.select_by_value(str(value))
            time.sleep(0.5)
        except:
            # 其他使用visibletext
            p_select.select_by_visible_text(value)
            time.sleep(0.5)

    def assertnote(self, value1='', value2=''):
        """
        断言不相等
        :param value1: 期望值
        :param value2: 实际值
        """
        if value1 == value2:
            print('断言失败')
            return False
        else:
            print('断言成功')
            return True

    def switchwin(self, title=''):
        handles = self.driver.window_handles
        # 按下标切换
        try:
            title = int(title)
            self.driver.switch_to.window(title)
        except:
            # 按标题切换
            for h in handles:
                self.driver.switch_to.window(h)
                if self.driver.title.__contains__(title):
                    break

    def intoiframe(self,lo=''):
        """
        进入iframe
        :param lo: 定位器（可以是xpath，id，css selector）
        """
        ele = self.__find_ele(lo)
        self.driver.switch_to.frame(ele)

    def outiframe(self):
        """
        退出iframe
        """
        self.driver.switch_to.default_content()
